package cn.mujiankeji.mbrowser.数据.数据库

import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Entity
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.PrimaryKey
import androidx.room.Query
import androidx.room.Update
import kotlinx.coroutines.flow.Flow

/**
 * IPv4 地址段实体
 * 记录中国大陆的 IPv4 地址段
 */
@Entity(tableName = "ipv4_ranges")
data class DBIpv4(
    @PrimaryKey(autoGenerate = true)
    var id: Long = 0,
    
    // IP 端描述，如 "103.66.200.0/22"
    var def: String = "",
    
    // IP 地址段的第一部分 (如 103)
    var a: Int = 0,
    
    // IP 地址段的第二部分起始值 (如 66)
    var b: Int = 0,
    
    // IP 地址段的第二部分结束值，如果与起始值相同则为 0
    var b2: Int = 0,
    
    // IP 地址段的第三部分起始值 (如 200)
    var c: Int = 0,
    
    // IP 地址段的第三部分结束值，如果与起始值相同则为 0
    var c2: Int = 0,
    
    // IP 地址段的第四部分起始值 (如 0)
    var d: Int = 0,
    
    // IP 地址段的第四部分结束值，如果与起始值相同则为 0
    var d2: Int = 0,
    
    // 分区标识，用于优化查询
    var zd: Int = 6
) {
    override fun toString(): String {
        return "$def - $a.${if (b2 == 0) b else b2}.${if (c2 == 0) c else c2}.${if (d2 == 0) d else d2}"
    }
}

/**
 * IPv6 地址段实体
 * 记录中国大陆的 IPv6 地址段
 */
@Entity(tableName = "ipv6_ranges")
data class DBIpv6(
    @PrimaryKey(autoGenerate = true)
    var id: Long = 0,
    
    // IPv6 端描述，如 "2407:eb80::/32"
    var def: String = "",
    
    // IPv6 地址段的前四个部分
    var v1: String = "",
    var v2: String = "",
    var v3: String = "",
    var v4: String = "",
    
    // 分区标识，用于优化查询
    var zd1: Int = 6,
    var zd2: Int = 0
)

/**
 * IPv4 地址段 DAO 接口
 * 提供对 IPv4 地址段数据的访问方法
 */
@Dao
interface DaoIpv4 {
    /**
     * 获取所有 IPv4 地址段
     */
    @Query("SELECT * FROM ipv4_ranges")
    fun 获取所有IPv4地址段(): Flow<List<DBIpv4>>
    
    /**
     * 根据分区标识获取 IPv4 地址段
     */
    @Query("SELECT * FROM ipv4_ranges WHERE zd = :zd")
    fun 获取指定分区IPv4地址段(zd: Int): Flow<List<DBIpv4>>


    
    /**
     * 根据 IP 地址第一部分查询地址段
     */
    @Query("SELECT * FROM ipv4_ranges WHERE a = :a")
    fun 根据A段查询IPv4地址段(a: Int): Flow<List<DBIpv4>>

    @Query("SELECT * FROM ipv4_ranges WHERE a = :a")
    suspend fun 根据A段查询IPv4地址段2(a: Int): List<DBIpv4>
    
    /**
     * 插入 IPv4 地址段
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun 插入IPv4地址段(ipv4: DBIpv4): Long
    
    /**
     * 批量插入 IPv4 地址段
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun 批量插入IPv4地址段(ipv4List: List<DBIpv4>): List<Long>
    
    /**
     * 更新 IPv4 地址段
     */
    @Update
    suspend fun 更新IPv4地址段(ipv4: DBIpv4)
    
    /**
     * 删除 IPv4 地址段
     */
    @Delete
    suspend fun 删除IPv4地址段(ipv4: DBIpv4)
    
    /**
     * 清空 IPv4 地址段表
     */
    @Query("DELETE FROM ipv4_ranges")
    suspend fun 清空IPv4地址段表()
}

/**
 * IPv6 地址段 DAO 接口
 * 提供对 IPv6 地址段数据的访问方法
 */
@Dao
interface DaoIpv6 {
    /**
     * 获取所有 IPv6 地址段
     */
    @Query("SELECT * FROM ipv6_ranges")
    fun 获取所有IPv6地址段(): Flow<List<DBIpv6>>
    
    /**
     * 根据分区标识获取 IPv6 地址段
     */
    @Query("SELECT * FROM ipv6_ranges WHERE zd1 = :zd1")
    fun 获取指定分区IPv6地址段(zd1: Int): Flow<List<DBIpv6>>
    
    /**
     * 根据 IPv6 地址前缀查询地址段
     */
    @Query("SELECT * FROM ipv6_ranges WHERE v1 = :v1")
    fun 根据前缀查询IPv6地址段(v1: String): Flow<List<DBIpv6>>
    
    /**
     * 根据完整前缀查询 IPv6 地址段数量 (v1+v2+v3+v4)
     */
    @Query("SELECT COUNT(*) FROM ipv6_ranges WHERE v1 = :v1 AND v2 = :v2 AND v3 = :v3 AND v4 = :v4 AND zd1 = :zd1")
    suspend fun 根据完整前缀查询IPv6地址段数量(v1: String, v2: String, v3: String, v4: String, zd1: Int): Int
    
    /**
     * 根据三段前缀查询 IPv6 地址段数量 (v1+v2+v3)
     */
    @Query("SELECT COUNT(*) FROM ipv6_ranges WHERE v1 = :v1 AND v2 = :v2 AND v3 = :v3 AND zd1 = :zd1")
    suspend fun 根据三段前缀查询IPv6地址段数量(v1: String, v2: String, v3: String, zd1: Int): Int
    
    /**
     * 根据两段前缀查询 IPv6 地址段数量 (v1+v2)
     */
    @Query("SELECT COUNT(*) FROM ipv6_ranges WHERE v1 = :v1 AND v2 = :v2 AND zd1 = :zd1")
    suspend fun 根据两段前缀查询IPv6地址段数量(v1: String, v2: String, zd1: Int): Int
    
    /**
     * 根据一段前缀查询 IPv6 地址段数量 (v1)
     */
    @Query("SELECT COUNT(*) FROM ipv6_ranges WHERE v1 = :v1 AND zd1 = :zd1")
    suspend fun 根据一段前缀查询IPv6地址段数量(v1: String, zd1: Int): Int
    
    /**
     * 插入 IPv6 地址段
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun 插入IPv6地址段(ipv6: DBIpv6): Long
    
    /**
     * 批量插入 IPv6 地址段
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun 批量插入IPv6地址段(ipv6List: List<DBIpv6>): List<Long>
    
    /**
     * 更新 IPv6 地址段
     */
    @Update
    suspend fun 更新IPv6地址段(ipv6: DBIpv6)
    
    /**
     * 删除 IPv6 地址段
     */
    @Delete
    suspend fun 删除IPv6地址段(ipv6: DBIpv6)
    
    /**
     * 清空 IPv6 地址段表
     */
    @Query("DELETE FROM ipv6_ranges")
    suspend fun 清空IPv6地址段表()
}
